'
\ufeffQ Write an address book program in python by using TKInter. Please download TKInterAddressBook.txt program. There are two task in this assignment. \ufeffAdd entry fields for City, State and Zip in the above Address Book program. \ufeffAdd logic for the Previous and Last button. When user click Previous button the program should display previous record and when click on Last button it should display last record. here the addressbook import pickle import ospath from tkinter import \ufeff# Import tkinter import tkinter.messagebox class Address: def initself \ufeffname, street: self.name \ufeffname self.street \ufeffstreet class AddressBook: def initself: window \ufeffTk \ufeff# Create a window window.titleAddressBook \ufeff# Set title self.nameVar \ufeffStringVar \ufeffself.streetVar \ufeffStringVar \ufeffframe \ufeffFramewindow \ufeffframepack \ufeffLabelframe \ufefftext"Name"gridrow \ufeffcolumn \ufeffstickyW \ufeffEntryframe \ufefftextvariableself.nameVar, widthgridrow \ufeffcolumn \ufeffframe \ufeffFramewindow \ufeffframepack \ufeffLabelframe \ufefftext"Address"gridrow \ufeffcolumn \ufeffstickyW \ufeffEntryframe \ufefftextvariableself.streetVar, widthgridrow \ufeffcolumn \ufeffframe \ufeffFramewindow \ufeffframepack \ufeffButtonframe \ufefftext"Add", commandself.processAddgridrow \ufeffcolumn \ufeffbtFirst \ufeffButtonframe \ufefftext"First", commandself.processFirstgridrow \ufeffcolumn \ufeffbtNext \ufeffButtonframe \ufefftext"Next", commandself.processNextgridrow \ufeffcolumn \ufeffbtPrevious \ufeffButtonframe \ufefftext \ufeff"Previous", command \ufeffself.processPreviousgridrow \ufeffcolumn \ufeffbtLast \ufeffButtonframe \ufefftext \ufeff"Last", command \ufeffself.processLastgridrow \ufeffcolumn \ufeffself.addressList \ufeffself.loadAddress \ufeffself.current \ufeffif lenselfaddressList: self.setAddress \ufeffwindow.mainloop \ufeff# Create an event loop def saveAddressself: outputFile \ufeffopenaddressdat", wb \ufeffpickle.dumpselfaddressList, outputFile \ufefftkinter.messagebox.showinfo \ufeff"Address saved", "A new address is saved" \ufeffoutputFile.close \ufeffdef loadAddressself: if not ospath.isfileaddressdat": return \ufeff# Return an empty list try: inputFile \ufeffopenaddressdat", rb \ufeffaddressList \ufeffpickle.loadinputFile \ufeffexcept EOFError: addressList \ufeffinputFile.close \ufeffreturn addressList def processAddself: address \ufeffAddressselfnameVar.get \ufeffself.streetVar.get \ufeffself.addressList.appendaddress \ufeffself.saveAddress \ufeffdef processFirstself: self.current \ufeffself.setAddress \ufeffdef processNextself: if self.current \ufefflenselfaddressList: self.current \ufeffself.setAddress \ufeffdef processPreviousself: pass # Left as exercise def processLastself: pass # Left as exercise def setAddressself: self.nameVar.setselfaddressListselfcurrentname \ufeffself.streetVar.setselfaddressListselfcurrentstreet \ufeffAddressBook \ufeff# Create GUI